import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router'

// 创建axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API || 'http://localhost:8082/api', // 设置默认接口地址
  timeout: 10000 // 缩短请求超时时间，避免长时间等待
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 请求头带上token
    const token = window.sessionStorage.getItem('token')
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    console.log('发送请求:', config.url, config.method, config.data || config.params)
    return config
  },
  error => {
    console.error('请求拦截器错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 如果响应类型是blob（文件下载），直接返回response
    if (response.config.responseType === 'blob') {
      // 检查是否有错误响应（JSON格式的错误信息）
      const contentType = response.headers['content-type'];
      if (contentType && contentType.includes('application/json')) {
        // 可能是错误响应，解析JSON
        return new Promise((resolve, reject) => {
          const reader = new FileReader();
          reader.onload = () => {
            try {
              const errorData = JSON.parse(reader.result);
              if (errorData.code !== 200) {
                Message({
                  message: errorData.msg || '操作失败',
                  type: 'error',
                  duration: 5 * 1000
                });
                reject(new Error(errorData.msg || '操作失败'));
              } else {
                resolve(response);
              }
            } catch (e) {
              // 如果解析失败，说明不是JSON，可能是正常的文件内容
              resolve(response);
            }
          };
          reader.onerror = () => resolve(response);
          reader.readAsText(response.data);
        });
      }
      return response;
    }
    
    const res = response.data
    console.log('响应数据:', res)
    
    // 如果响应状态码不是200，则判断为错误
    if (res.code !== 200) {
      Message({
        message: res.msg || '系统错误',
        type: 'error',
        duration: 5 * 1000
      })
      
      // 401: 未登录或token过期
      if (res.code === 401) {
        // 重新登录
        Message({
          message: '登录状态已过期，请重新登录',
          type: 'error',
          duration: 5 * 1000
        })
        // 清除本地token和用户信息
        store.dispatch('resetToken')
        // 跳转到登录页
        router.push('/login')
      }
      return Promise.reject(new Error(res.msg || '系统错误'))
    } else {
      return res
    }
  },
  error => {
    console.error('响应错误:', error)
    console.error('错误详情:', error.response || '无响应数据')
    
    // 处理401错误（未授权）
    if (error.response && error.response.status === 401) {
      Message({
        message: '登录状态已过期，请重新登录',
        type: 'error',
        duration: 5 * 1000
      })
      // 清除本地token和用户信息
      store.dispatch('resetToken')
      // 跳转到登录页
      router.push('/login')
      return Promise.reject(error)
    }
    
    let message = '请求失败，请稍后重试'
    
    // 检查是否是网络错误或后端未启动
    if (error.code === 'ECONNABORTED' || error.message.includes('timeout')) {
      message = '请求超时，请检查网络连接和后端服务状态'
    } else if (error.message.includes('Network Error')) {
      message = '网络错误，请确保后端服务已启动'
    } else if (error.response) {
      if (error.response.data) {
        // 如果响应是Blob类型且不是期望的类型，尝试读取其中的错误信息
        if (error.response.data instanceof Blob && error.response.data.type.includes('application/json')) {
          const reader = new FileReader()
          reader.onload = () => {
            try {
              const errorData = JSON.parse(reader.result)
              Message({
                message: errorData.msg || '导出失败',
                type: 'error',
                duration: 5 * 1000
              })
            } catch (e) {
              Message({
                message: '导出失败，服务器返回了非预期的响应',
                type: 'error',
                duration: 5 * 1000
              })
            }
          }
          reader.readAsText(error.response.data)
          return Promise.reject(new Error('导出失败'))
        }
        
        message = error.response.data.msg || error.response.data.message || `错误码: ${error.response.status}`
      } else {
        message = `服务器错误: ${error.response.status}`
      }
    } else if (error.request) {
      message = '服务器无响应，请确保后端服务已启动'
    } else {
      message = error.message || '未知错误'
    }
    
    Message({
      message: message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(new Error(message))
  }
)

export default service 